<?php

//Mas não informa diretamente como fazer o algorítmo:
//
//18. CÓDIGO NUMÉRICO DE VALIDAÇÃO: com 11 (onze) dígitos gerados a partir de algoritmo específico e de propriedade do DENATRAN, composto pelos dados individuais de cada CNH, permitindo a validação do documento;
//
//=============================================
//
//Art. 2º. O documento de Habilitação terá 2 (dois) números de identificação nacional e 1 (um) número de identificação estadual, que são:
//
//I – o primeiro número de identificação nacional – Registro Nacional, será gerado pelo sistema informatizado da Base Índice Nacional de Condutores – BINCO, composto de 9 (nove) caracteres mais 2 (dois) dígitos verificadores de segurança, sendo único para cada condutor e o acompanhará durante toda a sua existência como condutor, não sendo permitida a sua reutilização para outro condutor.
//
//II – o segundo número de identificação nacional – Número do Espelho da CNH, será formado por 8 (oito) caracteres mais 1 (um) dígito verificador de segurança, autorizado e controlado pelo órgão máximo executivo de trânsito da União, e identificará cada espelho de CNH expedida.
//
//a) O dígito verificador será calculado pela rotina denominada de “módulo 11” e sempre que o resto da divisão for zero (0) ou um (1), o dígito verificador será zero (0);
//
//III – o número de identificação estadual será o número do formulário RENACH, documento de coleta de dados do candidato/condutor gerado a cada serviço, composto, obrigatoriamente, por 11 (onze) caracteres, sendo as duas primeiras posições formadas pela sigla da Unidade de Federação expedidora, facultada a utilização da última posição como dígito verificador de segurança.


require_once "Basic.php";

class ClientEdit extends BasicEntity {

  private static $actionDescription = "Edit";
  
  private $name;
  private $idCliente;
  
  public function __construct($idCliente) {
    if(gettype($idCliente) !== "integer") {
      throw new Exception(htmlentities('$idCliente, passado ao construtor, não é integer.'));
    }
    
    $this->idCliente = $idCliente;

    $db = new DBUtils();
    
    $this->fields = null;
    try {
      $db->connect();
      $db->runQuery("select * from DadosCliente where idCliente = ?", array($idCliente));
      $item = $db->getItem();
      if($item === null) {
        $this->idCliente = null;
        $db->close();
        return;
      }
      else {
        $this->name = $item->nomeCliente;
        $dataValidadeCartao = $item->dataValidadeCartao;
        $vencimentoCNH = $item->vencimentoCNH;
        if($dataValidadeCartao !== null) {
          $dataValidadeCartao = $dataValidadeCartao->format("d/m/Y");
        }
        if($vencimentoCNH !== null) {
          $vencimentoCNH = $vencimentoCNH->format("d/m/Y");
        }
        $this->fields = array(
            new FormField(false, "logradouro", "Logradouro", new FormFieldTextLine(), $item->logradouro),
            new FormField(false, "numero", "N&uacute;mero", new FormFieldAbsNumber(), $item->numero),
            new FormField(false, "complemento", "Complemento", new FormFieldTextLine(), $item->complemento),
            new FormField(false, "bairro", "Bairro", new FormFieldTextLine(), $item->bairro),
            new FormField(false, "cep", "CEP", new FormFieldCEP(), $item->CEP),
            new FormField(false, "cidade", "Cidade", new FormFieldTextLine(), $item->nomeCidade),
            new FormField(false, "uf", "UF", new FormFieldChoice(UF::getAllUFS($db)), $item->UF),
            new FormField(false, "outrasInformacoes", "Outras Informa&ccedil;&otilde;es", new FormFieldTextBlock(), $item->outrasInformacoes),
            new FormField(false, "dataValidadeCartao", "Data de Validade do Cart&atilde;o de Cr&eacute;dito", new FormFieldDate(), $dataValidadeCartao),
            new FormField(false, "bandeiraCartao", "Bandeira do Cart&atilde;o de Cr&eacute;dito", new FormFieldTextLine(), $item->bandeiraCartao),
            new FormField(false, "numeroCartao", "N&uacute;mero do Cart&atilde;o de Cr&eacute;dito", new FormFieldAbsNumber(), $item->numeroCartao),
            new FormField(false, "codigoSegurancaCartao", "N&uacute;mero do C&oacute;digo de Seguran&ccedil;a Cart&atilde;o de Cr&eacute;dito", new FormFieldAbsNumber(), $item->codigoSegurancaCartao),
        );
        $this->processFields();
        $this->idEndereco = $item->idEndereco;
      }
    }
    catch(DBError $e) {
      $db->close(false);
      logMessage($e->errors, "ClientEdit");
      if($this->fields === null) {
        throw new Exception(htmlentities('$this->fields é null.'));
      }
    }
  }
  
  public function actionEdit() {
    foreach($this->fields as $k => $v) {
      $$k = $v->value();
    }
    
    if($numero !== null) $numero = intval($numero);
    if($dataValidadeCartao !== null) $dataValidadeCartao = FormFieldDate::toDateTime($dataValidadeCartao);
    if($uf === "-") $uf = null;
    
		$db = new DBUtils();
    try {
    	$db->connect();
    	
    	if($dataValidadeCartao !== null || $bandeiraCartao !== null || $numeroCartao !== null || $codigoSegurancaCartao !== null) {
    		if($dataValidadeCartao === null || $bandeiraCartao === null || $numeroCartao === null || $codigoSegurancaCartao === null) {
    			$this->fields["dataValidadeCartao"]->setValid($dataValidadeCartao !== null);
    			$this->fields["bandeiraCartao"]->setValid($bandeiraCartao !== null);
    			$this->fields["numeroCartao"]->setValid($numeroCartao !== null);
    			$this->fields["codigoSegurancaCartao"]->setValid($codigoSegurancaCartao !== null);
    			return htmlentities("Ou não se especifica dados sobre o cartão, ou se especifica todos.");
    		}
    	}
    	
			$db->beginTransaction();
			
			$updateQuery = <<<UQ
update Endereco
set logradouro = ?,
	  numero = ?,
	  complemento = ?,
	  bairro = ?,
	  cep = ?,
	  cidade = ?,
	  uf = ?,
	  outrasInformacoes = ?
where idEndereco = ?
UQ;

			$db->runQuery($updateQuery,
				array($logradouro, $numero, $complemento, $bairro, $cep, $cidade, $uf, $outrasInformacoes, $this->idEndereco));
			
			$updateQuery = <<<UQ
update Cliente
set dataValidadeCartao = ?,
	  bandeiraCartao = ?,
	  numeroCartao = ?,
	  codigoSegurancaCartao = ?
where idCliente = ?
UQ;
  
			$db->runQuery($updateQuery, array($dataValidadeCartao, $bandeiraCartao, $numeroCartao, $codigoSegurancaCartao, $this->idCliente));
    	$db->close();
    }
    catch(DBError $ex) {
    	$db->close(false);
      logMessage($ex->errors, "ClientEdit");
      return "Falha no banco de dados. O erro foi reportado.";
    }
    
    return true;
  }
  
  protected function actionDescription() {
    return ClientEdit::$actionDescription;
  }
  
  public function getClientName() {
    return $this->valid() ?  $this->name : "[???]";
  }
  
  public function valid() {
  	return $this->idCliente !== null;
  }
  
}

mustBe(isset($_GET["idCliente"]) && (isLoggedAsEmployee() || isLoggedAsClient($_GET["idCliente"])));
correctStdFormGET();

$idCliente = intval($_GET["idCliente"]);
$clientEdit = new ClientEdit($idCliente);
$page = new Page(htmlentities("Página de edição de cliente - " . $clientEdit->getClientName()));

if($clientEdit->valid()) {
  $form = new StdForm($clientEdit, $_GET, $_POST,
          "<p>" . htmlentities("Campos em negritos são obrigatórios.") . "</p>",
          "", "ClientEdit.php?idCliente=${idCliente}");
  if($form->processForm() === true && $form->receiving()) {
    header("Location: ClientInfo.php?idCliente=${idCliente}");
  }
  $page->addContent($form->getHtml());
}
else {
  $page->addContent('<p class="errorMessage">' . htmlentities("O usuário fornecido não existe. Erro interno.") . "</p>");
}

echo $page->getHtml();